import lookUp from "./lookUp";
import parseArrayToString from "./parseArrayToString";
/**
 * 将折叠好的tokens还原成data处理好的模板字符串
 * @param tokens 折叠的token
 * @param data 赋值渲染的data
 * @returns 赋值渲染后的模板字符串
 */
function toStringTokens(tokens: Array<any>, data: object): string { 
    // 初始化返回字符串
    let resultStr = '';
    // 遍历token并赋值
    for (let i = 0; i < tokens.length; i++) {
        let token = tokens[i];
        // 当当前token是纯文字，不需要赋值渲染时
        // 则直接相加
        if (token[0] === 'text') {
            resultStr += token[1];
        } 
        // 当当前token是 赋值型 数据时，则就需要找到相应的标准值进行渲染
        else if (token[0] === 'name') {
            resultStr += lookUp(data, token[1]);             
        } 
        // 当当前token是一个 数组 | 布尔值 得时候则需要进行相应分析
        else if(token[0] === '#') {
            // 查找需赋值的内容
            let value = lookUp(data, token[1]);
            // 判断响应值，如果相应值为 [] | [...] | true的时候执行
            if(value) {
                // 判断是否为数组
                if(Array.isArray(value)) {
                    resultStr += parseArrayToString(token[2], value);
                }
                // 非数组情况则为 true 类型的值，则改变量一定是一个具体的路径参数 a.b.c类型
                // 所以应该按照最大内容的值域就赋值
                else{
                    resultStr += toStringTokens(token[2], data);
                }
            }
        }
    }
    return resultStr;
}

export default toStringTokens;